package ar.fiuba.tp7552.buildadmin.service;

import java.math.BigDecimal;
import java.util.Collection;
import java.util.Date;

import org.springframework.security.access.prepost.PreAuthorize;

import ar.fiuba.tp7552.buildadmin.model.BusinessException;
import ar.fiuba.tp7552.buildadmin.model.builds.Edificio;
import ar.fiuba.tp7552.buildadmin.model.builds.Propiedad;
import ar.fiuba.tp7552.buildadmin.model.builds.Responsable;
import ar.fiuba.tp7552.buildadmin.model.expensas.Cobro;
import ar.fiuba.tp7552.buildadmin.model.expensas.Liquidacion;
import ar.fiuba.tp7552.buildadmin.model.expensas.TipoExpensa;
import ar.fiuba.tp7552.buildadmin.webactions.expensas.DetalleCobro;

public interface ExpensaService {
	
	@PreAuthorize("hasRole('ROLE_ADMIN')")
	void liquidarExpensa(Edificio edificio, Integer mes, Integer anio, TipoExpensa tipoExpensa) throws BusinessException;

	
	@PreAuthorize("hasAnyRole('ROLE_ADMIN', 'RESP_COBROS')")
	Cobro getCobro(Long id);
	
	@PreAuthorize("hasAnyRole('ROLE_ADMIN', 'RESP_COBROS')")
	Liquidacion getLiquidacion(Long id);
	
	
	@PreAuthorize("hasAnyRole('ROLE_ADMIN', 'RESP_COBROS') and #cobro.consolidado == false")
	void delete(Cobro cobro);
	
	DetalleCobro detalleCobro(Propiedad propiedad, TipoExpensa tipoExpensa, Date fechaCobro) throws BusinessException;
	
	Cobro registrar(Propiedad propiedad, TipoExpensa tipoExpensa, Date fechaCobro, String comprobante);
	
	Cobro registrar(Propiedad propiedad, TipoExpensa tipoExpensa, Date fechaCobro, String comprobante, BigDecimal monto) throws BusinessException;
	
	DetalleCobro reliquidar(Propiedad propiedad, TipoExpensa tipoExpensa, Date fechaCobro) throws BusinessException;
	
	void consolidar(Propiedad propiedad, Cobro cobro, TipoExpensa tipoExpensa, String comprobante) throws BusinessException;
	
	Collection<Liquidacion> findLiquidaciones(Edificio edificio, Responsable responsable);
}
